Шаг 6 - Получение имен NetBIOS

Загрузить проект
В этом шаге мы получим все имена связанные с конкретным числом LANA.

Первое, что мы сделаем это объявим константы

#define LANANUM     000			// Адрес LANA
#define LOCALNAME   "MYNET"		// Моё имя
#define MAX_SESSION 20			// Максимальное количество имен	
#define MAX_NAMES   30
Инициализируем NetBios по конкретному LANA используя команду NCBRESET
 	NCB ncb;
	UCHAR uRetCode; 
	memset (&ncb, 0, sizeof (ncb));
	//---------- Установка параметров
	ncb.ncb_command = NCBRESET;
	ncb.ncb_lsn = 0;                
	ncb.ncb_lana_num = LANANUM;
	ncb.ncb_callname[0] = MAX_SESSION;  
	ncb.ncb_callname[2] = MAX_NAMES;  
	//-------------- Вызов и проверка
	uRetCode = Netbios((NCB*) &ncb );
	if ( uRetCode != 0 )  
	{
		cout << "error NCBRESET " << endl;
		exit(1);
	}
Следующим шагом надо добавить имя, только для начала его нужно сформировать учитывая правила NetBios. Сформированное имя необходимо поместить в переменную ncb_name структуры NCB
	int i_strlen;
	NCB ncb1;
	 memset(&ncb1, 0, sizeof (ncb1));
	//---------------Создаем имя ----------------------
	i_strlen = strlen(LOCALNAME);
	if (i_strlen > NCBNAMSZ)    i_strlen = NCBNAMSZ;
	memset (ncb1.ncb_name, ' ', NCBNAMSZ);
	memcpy (ncb1.ncb_name, LOCALNAME, i_strlen);
	//--------- NetBios пораметры и запуск -------

        ncb1.ncb_command = NCBADDNAME;
        ncb1.ncb_lana_num = LANANUM;
	uRetCode = Netbios((NCB*) &ncb1 );
	if ( uRetCode != 0 )  
	{
		cout << "error NCBADDNAME " << endl;
		exit(1);
	}
Теперь мы можем воспользоваться командой NCBASTAT для получения информации в массив ADAPTER_STATUS откуда извлекаем их используя массив NAME_BUFFER. В ncb_callname необходимо имя дистанционного приложения. Мы его сначала добавили, а потом использовали для получения статуса адаптера.
	NCB ncb2;
	ADAPTER_STATUS *pStatus;
        memset (&ncb2, 0, sizeof (ncb2));
	HANDLE hHeap;
	int cbBuffer;
	hHeap = GetProcessHeap();
	cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER);
	pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer);
	//---------------
	memset (ncb2.ncb_callname, ' ', NCBNAMSZ);
	memcpy (ncb2.ncb_callname, LOCALNAME, i_strlen);
	//--------------- 
        ncb2.ncb_command = NCBASTAT;
        ncb2.ncb_lana_num = LANANUM;
	ncb2.ncb_buffer = (PUCHAR) pStatus;
        ncb2.ncb_length = cbBuffer;
	uRetCode = Netbios((NCB*) &ncb2 );
	if ( uRetCode != 0 )  
	{
		cout << "error NCBASTAT " << endl;
		exit(1);
	}
	// ---- Все нормально
	NAME_BUFFER *pNames;
	pNames = (NAME_BUFFER *) (pStatus + 1);
	for (int i = 0; i < pStatus->name_count; i++)  printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name);
В результате работы программы на экране должно быть что-то типа этого, как ниже.

6_1.gif (3155 b)

Если Вы не сможете сами, то загрузите проект. Мне пришлось всё это скомкать вместе из-за того, что nbstat я почему-то не нашел, но в следуюших шагах я постараюсь разделить этот проект на более понятные части.

Hosted by uCoz